package utils;

import com.alibaba.fastjson.util.TypeUtils;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class PageTool {

    /**
     * 根据查询语句和分页参数,组装分页查询sql,并执行得到分页数据列表
     *
     * @param sql
     * @param pageIndex
     * @param pageSize
     * @param params
     * @return
     */
    private List<HashMap<String, Object>> getPageOriginData(String sql, Integer pageIndex, Integer pageSize, Object... params) {
        //此方法只考虑了mysql的分页方言
        //根据页码,页长,计算起始位置,例如第1页,10条数据,即头部偏移,10长度∶limit 0,10;第2页,10条数据,即头部偏移10 ,10长度:limit10, 10
        Integer start = pageIndex * pageSize;
        //将传入的sql包装成子查询pagedtb,并加入mysql分页方言limit
        String pageSql = "select * from (" + sql + ") pagedtb limit " + start + "," + pageSize;
        JdbcUtil jdbcUtil = new JdbcUtil();
        //使用jdbcUtil工具执行组装后的sql
        List<HashMap<String, Object>> result = jdbcUtil.getList(pageSql, params);
        return result;

    }

    /**
     * 根据查询语句和分页参数,组装查询总数,并执行得到分页数据列表
     *
     * @param sql
     * @param params
     * @return
     */
    private Long getTotalCount(String sql, Object... params) {
        //将传入的sql包装成子查询totaltb,增加count计数
        String countSql = "select count(1) totalCount from (" + sql + ") totaltb ";
        //使用jdbcUtil工具执行计数sql,得到结果
        JdbcUtil jdbcUtil = new JdbcUtil();
        Map<String, Object> countMap = jdbcUtil.getOne(countSql, params);
        if (countMap != null && countMap.containsKey("totalCount")) {
            return TypeUtils.castToLong(countMap.get("totalCount"));
        }
        return 0l;

    }

    /**
     * 分页sql查询
     *
     * @param sql
     * @param pageIndex
     * @param pageSize
     * @param pargms
     * @return
     */
    public Page getSqlPageResult(
            String sql,
            Integer pageIndex,
            Integer pageSize,
            Object... pargms) {
        //调用分页查询获得分页列表
        List<HashMap<String, Object>> pagedData = getPageOriginData(sql, pageIndex, pageSize, pargms);
        //调用获取总数方法,获取sql查询对应的总数
        Long totalCount = getTotalCount(sql, pargms);


        //创建数据分页对象
        Page pageResult = new Page();
        //赋值原始数据
        pageResult.setOriginalData(pagedData);
        //赋值总记录数
        pageResult.setTotalCount(totalCount);
        //计算总页数
        Integer pageCount = 0;
        if (pageSize > 0) {
            if (totalCount > pageSize) {//总记录数大于夜长
                if (totalCount % pageSize == 0) {//取余为0,正好满也长
                    pageCount = totalCount.intValue() / pageSize;
                } else {
                    pageCount = totalCount.intValue() / pageSize + 1;//有余数,需要加1页尾
                }
            } else {//总记录数小于页长
                if (totalCount > 0) {
                    pageCount = 1;
                }
            }
        }
        //赋值总页数
        pageResult.setPageCount(pageCount);
        //赋值是否首页
        pageResult.setFirst(pageIndex.equals(0));
        //赋值是否尾页
        pageResult.setLast(pageIndex.equals(pageCount - 1));
        //赋值页长
        pageResult.setPageSize(pageSize);
        //返回分页对象,List<T> content的转化需要在业务层代码中完成
        return pageResult;

    }
}
